<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Generator函数</title>
</head>
<body>

  <!--
   Generator函数
    概念：
      1、ES6提供的解决异步编程的方案之一
      2、Generator函数是一个状态机，内部封装了不同状态的数据，
      3、用来生成遍历器对象
      4、可暂停函数(惰性求值), yield可暂停，next方法可启动。每次返回的是yield后的表达式结果
    特点：
      1、function 与函数名之间有一个星号
      2、内部用yield表达式来定义不同的状态
      例如：
        function* generatorExample(){
          let result = yield 'hello';  // 状态值为hello
          yield 'generator'; // 状态值为generator
        }
      3、generator函数返回的是指针对象(接11章节里iterator)，而不会执行函数内部逻辑
      4、调用next方法函数内部逻辑开始执行，遇到yield表达式停止，返回{value: yield后的表达式结果/undefined, done: false/true}
      5、再次调用next方法会从上一次停止时的yield处开始，直到最后
      6、yield语句返回结果通常为undefined， 当调用next方法时传参内容会作为启动时yield语句的返回值。
  -->
<script type="text/javascript" src="./js/jquery-1.10.1.min.js"></script>
<script type="text/javascript">
	
	//一个简单的迭代器
	var obj = {
		name:"bart",
		age:"18"
	}
  
  obj[Symbol.iterator] = function* (){
  	yield 0
  	yield 1
  	yield 2
  }
  // 迭代该对象
  for(let o of obj){
  	console.log(o);
  }
  
  /* 
  	对象的Symbol.iterator属性  指向遍历器对象
  	每次遇到 yield 就会停止执行,无论 yield 是跟了参数还是作为函数调用的参数
  	要想获得 yield 的返回值(注意是yield的返回值不是mg.next()函数的返回值)
  	就只能在下一个mg.next('args')中传入参数
  */
	function* myGenerator(){
		console.log(" 0 之前")
		yield 0 // 为 next() 的返回值
		
		console.log(" -2 之前")
		let v2 = yield -2
		
		console.log("yield 的返回值 "+v2)
		console.log(" 2 之前")
		
		yield 2
		console.log(" return -1 之前")
		return -1 // 表示迭代器迭代完了
	}
  
  var mg = myGenerator(); // 返回的是指针对象
  
  console.log(mg.next())//Object {value: 0, done: false}
  console.log(mg.next())//Object {value: undefined, done: false}
  console.log(mg.next(3))//Object {value: 2, done: false}
  console.log(mg.next())//Object {value: -1, done: true}
  
  console.log("--------------------------");
  
  //设计一个惰性的迭代器产生0~10的整数
  
	  
  
	
	



    

</script>


</body>
</html>